home *** CD-ROM | disk | FTP | other *** search
/ MacUser Mac Bin 25 / MACUSER-MACBIN25-1995-12.ISO.7z / MACUSER-MACBIN25-1995-12.ISO / 本誌連動 / HyperCard office.9512⁄CD / 95-12 < prev    next >
Text File  |  1995-10-08  |  12KB  |  183 lines

  1. 95/12 ハイパーテキストへ
  2.  
  3. ハイパーカードはその名前を見ても分かるとおりハイパーテキストと密接な関連がある。組み込み機能だけを使って、ハイパーテキストをどこまで実現できるか追求してみる。
  4.  
  5. --
  6. ハイパーテキストとは
  7.  
  8.  1962年、テッド・ネルソンはハイパーテキストを提唱した( _*注1_ )。これは、簡単にいってしまえば文書から「順序」という概念を取り除いたものである。書物が基本的に最初から順番に読まれることを前提にしているのに対し、ハイパーテキストは関連する内容を縦横に結び、読者が自由に行きつ戻りつすることができる仕組みだ。情報洪水の中では、このようにして本当に必要なものを効率的に選び出す手段が不可欠になる。オフィスでも、山のような書類から求める情報をうまく見つける方法が欠かせない。
  9.  ハイパーカードが1987年に登場したときは、このハイパーテキストがいよいよパーソナルなレベルで実現できると期待が集まったものだ。そして、一部ではハイパーカードを用いて優れたシステムが構築されもしたのだが、意外にこの方面でハイパーカードが広く活用されるには至っていない。むしろ最近インターネットでWWWなどが出現してようやくハイパーテキストらしいものが身近になった。
  10.  ハイパーカードではボタンを使って縦横のリンクを簡単に構築できる。これが単なるカードの移動以上に使われていないのは、ハイパーテキストを設計し、きちんとリンクを張っていくのが結構面倒な作業であるということが原因だと思われる。今回は、リンクの設定を簡単にし、ハイパーカードの持ち味を引き出す方法を探ってみよう。
  11.  
  12. --
  13. ボタンによるリンクの実践とその限界
  14.  
  15.  ハイパーカードでハイパーテキストを実現する最も分かりやすい方法は、ボタンによるカードのリンクである(画面1)。しかし、このリンクではカードとカードの関係しか表現することができない。フィールドに表示されている特定の言葉に対してリンクを作成するのは、このままでは不可能である。
  16.  フィールドに納めるテキストが比較的短く、スクロールさせる必要がないときは、アンカーにする語句の上に透明ボタンを作るという方法もある(画面2)。これは一つの解決策ではあるが、テキストに対する制約が大きくなる上に、多彩なリンクを表現するためにいちいちボタンを作っていては効率が悪い。
  17.  ハイパーテキストというからには、テキストそのものがアンカーになって関連するカードにリンクできることが望まれる。ある語句をクリックすると、その語句を説明するカードにジャンプするというような仕組みはできないだろうか。
  18.  
  19. --
  20. テキストボタンの実現
  21.  
  22.  フィールドのテキストをアンカーとするためには、 _the clickText_ 関数を使って、マウスがどの語句( _word_ )をクリックしたかを調べ、その語句とカード名が一致するカードを探せばよい。つまり
  23.   go cd the clickText
  24. のようにすれば、あっと言う間にハイパーテキストの出来上がりだ。
  25.  ところが、これは英文でしかうまく働かない。日本語ではthe clickTextで単語ではなく文(段落)全体が返されてしまうのである。
  26.  そこで目を付けたのが、フィールドのテキストが持つ「グループ」スタイル属性(画面3)だ( _*注2_ )。この属性を使うと、クリックしたときにthe clickTextで得られるまとまりを、wordを越えて直接指定することができる。グループが設定されていれば、日本語でもクリックしたときにthe clickTextが段落全体ではなくそのグループを返してくれるのだ。
  27.  これを利用して日本語ハイパーテキストを実現したのが _リスト1_ である。2行目でクリックした部分がグループになっているかどうかを調べ、グループ化されている語句に対してその語句がカード名になっているカードへ移動する( _*注3_ )。
  28.  
  29. --
  30. リンクの自動作成
  31.  
  32.  さて、本題はこれからである。最初に、ハイパーカードでハイパーリンクが余り広く使われないのは、設計とリンクの設定が面倒であることが一つの要因であると述べた。前節の方式でも、アンカーとなる語句を一つ一つ選んで「グループ」スタイルを設定していくのは楽な作業ではない。そこで、この作業を何とか自動化してしまおうというのが今回の目論見である。
  33.  例によって、材料はHDBスタイルのテキスト( _*注4_ )ということにする。自動化の内容は、
  34. ❶HDBを読み込んでレコードごとにテキストをカードに振り分け
  35. ❷本文中に別のレコードのタイトルと同じ語句があったら、その語句をグループ化する
  36. というものだ。
  37.  最初のレコードの振り分けは、これまで何度も登場した「区切り行」によるHDB処理の応用である。新しいレコードになるたびに新規カードを作成し、カードの名前をタイトルと同じに設定していく( _*注5_ )。自動化のポイントはこのあとのグループの設定である。
  38.   _リスト2_ を見てみよう。引数のtitleListは、❶のレコード切り分けのときに記録しておいたタイトルのリストである。これを使って、タイトルと同じ語句(検索語句)が本文フィールドに含まれているかどうかを順に調べていく。5〜19行のループでは、 _find string_ 命令で検索語句を繰り返し調べている。目指す言葉を発見したら、17行目でその部分のスタイルを「グループ」に設定するのである( _*注6_ )。
  39.  これを実行してみると画面4のようなスタックができあがった。グループ化された語句は、 _リスト1_ によって該当するカードへのハイパーリンクを持つことになる。
  40.  
  41. --
  42. ダイナミックなリンクを考える
  43.  
  44.  前節のHDBの自動リンク設定では、あらかじめよく考えてタイトルを付けないと、全くリンクが作られなかったり、逆に不要なリンクだらけになったりする可能性がある(画面5)。しかも、このようなリンクを前提に作成した文書は、あとから構造を変えることが難しくなってしまう。
  45.  文書からハイパーリンクのシステムを作る場合、内容が更新される可能性のあるものについては、オリジナル文書を変更してもリンクが維持できる仕組みの方が望ましい。そこで、一歩進んで本文そのものにリンクの指示を埋め込む拡張HDBを考えることにしよう。前節の方法が静的なリンクであったのに対し、こちらはいわば動的なリンクを作成するわけである。
  46.  このような機能を実現するには、HyperDBのように、スタックには見出し一覧だけ持ち、本文はその都度テキストファイルから読み込んで表示する形式が扱いやすい。外部からレコードを取り込んでフィールドに書き込むときに、合わせてリンクの情報も調べて表示する。こうすれば、いくらテキストを書き直しても最新のリンク情報を反映させることが可能なはずだ。
  47.  
  48. --
  49. 拡張HyperDBの実現
  50.  
  51.  具体的には、リンクの元(アンカー)となるべき語句を、何らかの記号で識別できるようにしておく。この記号は何でもよいのだが、単純にテキストとして読んだときに邪魔にならず、できれば他のブラウザ上でも何らかの機能を果たせるものがよい。ここでは、EasyViewで下線を表示できる_(アンダースコア)を使うことにする。アンカーにする語句を_で囲み、更にその両側に半角スペースを置く( _*注7_ )。つまりハ_アンカーの語句_ハのようになる。
  52.  これを動的にホットテキストにするには _リスト3_ のようなスクリプトを使う。showDataはHyperDBのタイトルフィールドをクリックしたときに呼び出されるハンドラで、1〜5行は従来通り、選択したレコードをフィールドに書き込む部分。今回の新機軸は6行目で登場するhotPos関数である。これは、フィールドのレコードの中でアンカーとなっているところを調べ(13, 15行目)その位置を返すもの。17行目で自分を再帰的に呼び出して、全てのアンカーを探すようになっている。この結果を使って、7〜9行目でフィールドのテキストのアンカー部分を「グループ」に設定していく。これでレコードを読むたびにリンクが用意されるというわけだ。
  53.  このホットリンクを実行するフィールドのハンドラは基本的にリスト1と同じものだが、カードにレコードを振り分けているわけではないので、 _リスト4_ のようにタイトル一覧から該当するものを検索して、もう一度リスト3のshowDataを呼ぶようにした。以上でダイナミック・ハイパーリンクの完成である(画面6)。
  54.    *   *   *
  55.  オフィスにおけるハイパーテキストの実現は、9月号で検討したようなHTMLへの変換によるWEBブラウザの活用という方法もある( _95-09:HyperDBとの連動_ )。ただ、こうした変換による方法では、オリジナルに変更があるといちいちHTML文書も作りなおさなければならない。拡張HDBは機能は単純ながら、オリジナルファイルをそのままハイパーテキストにできるというところが強みである。文書の性質に応じて、これらの手法を使い分ければ、強力なハイパーオフィスが構築できるだろう。
  56.  
  57. --
  58. *注1
  59.  
  60. ハイパーテキストの概念自体は1945年のヴァネヴァー・ブッシュによって提唱されたMEMEXにまでさかのぼる。このあたりの参考文献は多数あるが、たとえば奧出直人『思考のエンジン』などを参照。
  61.  
  62. --
  63. *注2
  64.  
  65. もともとは英文をクリックしたとき2つ以上のwordを得るために、それらの単語をグループ化しておくスタイル。show groupsとすると、グループ化された語句にグレーの下線が付き、一目で分かるようになる。
  66.  
  67. --
  68. *注3
  69.  
  70. 製品版のハイパーカードに含まれる「ヘルプ」も同様の仕組みで関連するトピックを次々に調べられるようになっている。
  71.  
  72. --
  73. *注4
  74.  
  75. 7月号で作成したHyperDB形式のデータのこと。レコードをハイフン2つの行(--)で区切り、各レコードの最初の1行を見出しとするテキストファイル。添付CD-ROMに、これまでの連載のテキストをこの形式で収録している( _95-07:データファイルの作成_ 参照)。
  76.  
  77. --
  78. *注5
  79.  
  80. この部分のスクリプトの構造は何度も解説したので省略する。サンプルスタック「HDB-HyperText」のボタン「HDB->HyperLink」のスクリプトにある関数parseRecords()を参照( _95-07:タイトルの抽出_ 、 _95-11:テキストデータベースとしてのメッセージ_ なども参考に)。
  81.  
  82. --
  83. *注6
  84.  
  85. 自分に対してリンクを設定しても意味がないので、 _リスト3_ の14行目でカードのタイトルが検索語句そのものでないかどうかを確認しておく。
  86. なお、このループは繰り返し回数を指定せず、変数foundFirstに検索語句が最初に見つかった場所を記録しておき(9〜10行目)、検索を続けてfoundFirstに記録した場所に戻ってきたら終了するという設定になっている(11行目)。
  87.  
  88. --
  89. *注7
  90.  
  91. EasyView上で下線を表現する場合、単語をアンダースコアで囲むのだが、日本語の場合単語の切れ目がないため、半角スペースを置いてアンカーを独立させる必要がある。
  92.  
  93. --
  94. リスト1
  95.  
  96.  1: on mouseUp
  97.  2:   if the textStyle of the clickChunk contains "group" then
  98.  3:     get the clickText
  99.  4:     go cd it
  100.  5:   end if
  101.  6: end mouseUp
  102.  
  103. --
  104. リスト2
  105.  
  106.  1: on setLink titleList
  107.  2:   repeat with i=1 to number of lines of titleList
  108.  3:     put line i of titleリストinto tgStr
  109.  4:     put "" into foundFirst
  110.  5:     repeat
  111.  6:       find string tgStr in fld "myText"
  112.  7:       get  _the foundChunk_ 
  113.  8:       if it is "" then exit repeat
  114.  9:       else if foundFirst is "" then
  115. 10:         put it & short name of this cd into foundFirst
  116. 11:       else if it & short name of this cd is foundFirst then
  117. 12:         exit repeat
  118. 13:       end if
  119. 14:       if short name of this cd is tgStr then
  120. 15:         go next cd
  121. 16:       else
  122. 17:         set textStyle of the foundChunk to "Group"
  123. 18:       end if
  124. 19:     end repeat
  125. 20:   end repeat
  126. 21: end setLink
  127.  
  128. --
  129. リスト3
  130.  
  131.  1: on showData lineNo
  132.  2:   put line lineNo to LineNo+1 of fld "Index" into POS
  133.  3:   put ReadFile(line 2 of fld "FileInfo") into str
  134.  4:   get line (line 1 of POS +1) to (line 2 of POS -1) of str
  135.  5:   put it into fld "TEXT"
  136.  6:   put hotPos(it) into hotPositions
  137.  7:   repeat with i=1 to number of lines of hotPositions
  138.  8:     set textStyle of char item 1 of line i of hotPositions to item 2 of line i of hotPositions of fld "TEXT" to "group"
  139.  9:   end repeat
  140. 10: end showData
  141.  
  142. 11: function hotPos str, stOff
  143. 12:   get number of chars of str
  144. 13:   put offset(" _", str) into hot1
  145. 14:   if hot1 is 0 then return ""
  146. 15:   put offset("_ ", char hot1 + 1 to it of str) + hot1 into hot2
  147. 16:   put stOff + hot1+2 &"," & stOff + hot2-1 & RETURN into res
  148. 17:   put hotPos(char hot2+1 to it of str, stOff + hot2) after res
  149. 18:   return res
  150. 19: end hotPos
  151.  
  152. --
  153. リスト4
  154.  
  155.  1: on mouseUp
  156.  2:   if the textStyle of the clickChunk contains "group" then
  157.  3:     get the clickText
  158.  4:     find it in fld "Title"
  159.  5:     showData (word 2 of the foundLine)
  160.  6:   end if
  161.  7: end mouseUp
  162.  
  163. --
  164. word
  165.  
  166. ハイパーカードで言うwordはスペースや改行で区切られた、もしくは""で囲まれた一連の文字列をさす。日本語の場合は、仮名漢字の違いや句読点に関係なく、全角文字の連なり全体がwordとして扱われてしまう。このため、wordを利用したHyperTalkを使う場合に注意が必要になる。
  167.  
  168. --
  169. the clickText
  170.  
  171. テキストをロックしたフィールドをクリックすると、クリックした部分のテキストに関する情報を得ることができる。このthe clickTextではクリック位置にある語句(word)が直接返される。ポジションを調べるにはthe clickChunkを使う。この場合にはchar 10 to 20 of bkgnd field 1のような結果になる。いずれも本文で説明したように日本語では語句ではなく段落全体が返されてしまうので、「グループ」スタイルを設定しておく必要がある。また、the clickLineではline 3 of bkgnd field 1のような結果が得られる。
  172.  
  173. --
  174. find string
  175.  
  176. 英文の場合、find "MacUser Japan"とすると、MacUserという単語とJapanという単語がAND検索され、必ずしも連続していなくてもこの2語がカード上にあればヒットしてしまうので、"MacUser Japan"を一まとまりとして検索する場合にはfind stringとしなければならない。日本語の場合は、wordの扱いが異なるのでfindとしても実質的には違いはない。
  177.  
  178. --
  179. the foundChunk
  180.  
  181. find命令で見つかった文字列の位置をchar 10 to 20 of bkgnd field 1のようなかたちで返す。the foundField、the foundLine、the foundTextのようなバリエーションでは、それぞれ見つかったフィールド、行、テキストそのものが得られる。
  182. --
  183.